// bind 和 call的思路:
// 目的: 将obj的this交给Function来调用，并且还能将一些参数传给Function例如:
//      console.log(this.name);
//      console.log(this.age);
//      console.log(test);
//      此时say函数的this不是自身而是obj
//      test是第二个参数 吗 
// 俩个重点：
//      首先call函数的this是指向调用它的函数,例如本次实例为say能够调用call上的属性和方法。
//      其次Mycall的第一个参数context,表示该函数
Function.prototype.Mycall = function (context = window, ...args) {
    if (typeof this !== 'function') {  // 加上判断，调用Mycall 的是否是一个function
        throw new TypeError('Type Error');
    }
    let fn = Symbol('fn');
    // console.log(context) 
    context[fn] = this;
    const result = context[fn](...args);
    delete context[fn];
    return result;
}

let obj = {
    name: 'qaq',
    age: 18
}

let say = function (test) {
    console.log(this.name);
    console.log(this.age);
    console.log(test);
}

console.log(say.Mycall(obj, 1234));